package com.bjc.platform.export;

import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.sql.Connection;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.export.JRXlsAbstractExporter;
import net.sf.jasperreports.engine.export.JRXlsAbstractExporterParameter;
import net.sf.jasperreports.j2ee.servlets.BaseHttpServlet;

import com.bjc.platform.exception.JasperReportException;

/**
 * 利用报表生成Xls的基类
 */
public abstract class BaseExcelExport {
	/**
	 * 导出报表
	 * 
	 * @param request
	 * @param response
	 * @param reportFilePath
	 * @param params
	 * @param con
	 * @param fileName
	 * @throws JasperReportException
	 */
	public void export(HttpServletRequest request,
			HttpServletResponse response, String reportFilePath, Map params,
			Connection con, String fileName) throws JasperReportException {
		JasperPrint jasperPrint = new JasperPrintWithConnection(reportFilePath,
				params, con).getJasperPrint();
		// 将填充完的japserPrint放入session中。
		request.getSession().setAttribute(
				BaseHttpServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE,
				jasperPrint);
		// 拿到japserPrintList
		List jasperPrintList = BaseHttpServlet.getJasperPrintList(request);
		// 若没有JasperPrintList，则抛出异常
		if (jasperPrintList == null) {
			throw new JasperReportException(
					"在Http Session中没有找到JasperPrint List");
		}
		try {
			OutputStream ouputStream = response.getOutputStream();
			try {

				response.setContentType("application/xls");
				response.setCharacterEncoding("UTF-8");
				if (fileName == null || fileName.equals(""))
					response.setHeader("Content-Disposition",
							"inline; filename=\"noTitle.xls\"");
				else {
					response.setHeader(
							"Content-Disposition",
							"inline; filename=\""
									+ URLEncoder.encode(fileName, "UTF-8")
									+ ".xls\"");

				}
				// Xls格式的导出器 JRXlsAbstractExport
				JRXlsAbstractExporter exporter = getXlsExporter();
				
				// 在导出器中放入要导出的japserPrintList
				exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST,
						jasperPrintList);

				exporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
						ouputStream);
				// 设置Xls的属性
				exporter.setParameter(
						JRXlsAbstractExporterParameter.IS_ONE_PAGE_PER_SHEET,
						Boolean.FALSE);
				exporter.setParameter(
						JRXlsAbstractExporterParameter.IS_WHITE_PAGE_BACKGROUND,
						Boolean.FALSE);
				// 导出
				exporter.exportReport();
			} catch (JRException e) {
				e.printStackTrace();
				throw new JasperReportException("在生成XLS报表时发生错误!");
			}

			finally {
				if (ouputStream != null) {
					try {
						ouputStream.close();
					} catch (IOException ex) {
					}
				}
			}
		} catch (IOException ioe) {
			ioe.printStackTrace();
			throw new JasperReportException("从Response中取得OutputStream时发生错误!");
		}

	}

	protected abstract JRXlsAbstractExporter getXlsExporter();

}